// IO 函子的问题
const fp = require ('lodash/fp')
const fs = require('fs') //node 的读取方法 fs模块
class Io {
    constructor (fn) {
        this._value = fn
    }
    static of(x) {
        return new Io (function() {
            return x
        })
    }
    map(fn) {
        // 把当前得value 和传入得fn 组成一个新得函数
        return new Io(fp.flowRight(fn, this._value))
    }
}
// 读取文件
let readFile = function(filename) {
    return new Io(function() {
        return fs.readFileSync(filename, 'utf-8')
    })
}

let print = function (x) {
    return new Io(function() {
        console.log(x)
        return x
    })
}

let cat = fp.flowRight(print , readFile)
let r = cat('package.json')
console.log(r._value()._value())
// console.log(r)
// 这里我们能看到 r是 IO(IO(x)) 多层嵌套的 IO函子 很麻烦 所以要用到了 monad 来拍扁 这个嵌套 